package DAO.ImpJDBC;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import DAO.Util.ConnectionFactory;
import DAO.Util.CriptografiaSha512;
import DAO.Util.Mensagens;
import DAO.UsuarioDAO;
import DAO.model.Usuario;

public class UsuarioDaoJDBC implements UsuarioDAO {

	public String cadastraUsuario(Usuario usuario) {
		
		/* Mensagens caso falte algum atributo  */
		if(usuario.getNome().equals("")) return Mensagens.CAMPO_NOME_OBRIGATORIO;
		else if(usuario.getLogin().equals("")) return Mensagens.CAMPO_LOGIN_OBRIGATORIO;
		else if (usuario.getSenha().equals("")) return Mensagens.CAMPO_SENHA_OBRIGATORIO;
		else if (usuario.getNascimento() == null) return Mensagens.CAMPO_NASCIMENTO_OBRIGATORIO;
		
		Connection con = null;
		
		CriptografiaSha512 crip = new CriptografiaSha512();
		usuario.setSenha(crip.gerarHash(usuario.getSenha(), "SHA-512"));
		
		try {
			con = ConnectionFactory.getConnection();
			if (con != null) {
				String sql = "INSERT INTO usuarios (nome, nascimento, login, senha) VALUES (?, ?, ?, ?)";
				PreparedStatement ps = con.prepareStatement(sql);
				ps.setString(1, usuario.getNome());
				ps.setDate(2, new Date(usuario.getNascimento().getTime()));
				ps.setString(3, usuario.getLogin());
				ps.setString(4, usuario.getSenha());
				ps.executeUpdate();
				ps.close();
			}
		} catch (SQLException e) {
			return Mensagens.LOGIN_EXISTENTE;
		} finally {
			try {
				con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return null;
			}
		}
		return Mensagens.SUCESSO_CADASTRO;	
	}

	public String getUsuarioByLoginSenha(Usuario usuario) {
		Connection con = null;
		String user = null;
		
		if(usuario.getSenha().equals("|")) return Mensagens.CAMPO_SENHA_OBRIGATORIO;
		else if(usuario.getLogin().equals("|")) return Mensagens.CAMPO_LOGIN_OBRIGATORIO;
		
		CriptografiaSha512 crip = new CriptografiaSha512();
		usuario.setSenha(crip.gerarHash(usuario.getSenha(), "SHA-512"));
		
		try {
			con = ConnectionFactory.getConnection();
			if (con != null) {
				String sql = "SELECT * FROM usuarios WHERE login =  ? AND senha = ?";
				PreparedStatement st = con.prepareStatement(sql);
				st.setString(1, usuario.getLogin());
				st.setString(2, usuario.getSenha());
				ResultSet rs = st.executeQuery();
				if (rs.next()) {
					user = rs.getString("nome") + "," + rs.getString("login")
							+ "," + rs.getString("senha") + ","
							+ rs.getString("nascimento") + "," + Mensagens.SUCESSO_LOGIN;
				}else{
					return Mensagens.LOGIN_SENHA_INVALIDOS;
				}
				rs.close();
				st.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return user;
	}

	public List<Usuario> listarUsuarios() {
		Connection con = null;
		List<Usuario> usuarios = new ArrayList<Usuario>();
		try {
			con = ConnectionFactory.getConnection();
			if (con != null) {
				String sql = "SELECT * FROM usuarios";
				PreparedStatement st = con.prepareStatement(sql);
				ResultSet rs = st.executeQuery();
				while (rs.next()) {
					Usuario usuario = new Usuario();
					usuario.setNome(rs.getString("nome"));
					usuario.setNascimento(rs.getDate("nascimento"));
					usuario.setLogin(rs.getString("login"));
					usuario.setSenha(rs.getString("senha"));
					System.out.println(usuario);
					usuarios.add(usuario);
				}
				rs.close();
				st.close();
			} else {
				return usuarios;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return usuarios;
	}
}
